package net.ieslaferreria.infoCiutat;

/*
 * -----------------------------------------------------------------------
 *  FECHA      HORA   NOMBRE    COMENTARIO 
 * -----------------------------------------------------------------------
 *  30/05/08   00:18  ALEX      Implementación de los metodos SET.
 *  21/05/08   19:44  ALEX      Implementación de la clase
 *  15/05/08   17:00  SERGIO    Añadir metodo setInformació.
 *  14/05/08   20:50  SERGIO    Modificacions varias puntImpl
 *  09/05/08   19:00  DAVID     Creación de clase y algunos metodos
 *  08/05/08   17:40  DAVID     Creación de interface 
 *  02/06/08   17:04  JAVI      extends persistent
 */



import java.util.Vector;
import org.garret.perst.IInputStream;
import org.garret.perst.IOutputStream;
import org.garret.perst.IPersistent;
import org.garret.perst.Persistent;
import org.garret.perst.Storage;

/**
 * Interficie que representa un punt.
 * 
 * @author David Maqueda, Javi Xaranda, Alex Fernández, Sergio Soria.
 */
public class PuntImpl extends Persistent implements Punt, PuntInteres {

    /*
     * Variable que conté el codi del punt
     */
    private int codi;
    /*
     * Variables que conté el nom del punt
     */
    private String nom;
    /*
     * Variable que conté la longitud de la situació del punt expressat en graus.
     */
    private int longitud;
    /*
     * Variable que conté la latitud de la situació del punt expressat en graus.
     */
    private int latitud;
    /*
     * Variable que conté el nom de la ciutat a la que pertany el punt.
     */
    private String ciutat;
    /*
     * Variable que conté el nom de la linia a la que pertany el punt.
     */
    private String linia;
    /*
     * Variable que conté el codi de la xarxa a la que pertany el punt.
     */
    private int codiXarxa;
    /*
     * Variable que conté el tipus de punt que tractem.
     */
    private TipusPunt tipus;
    /*
     * Variable que conté la coordenada x del punt.
     */
    private int x;
    /*
     * Variable que conté la coordenada y del punt.
     */
    private int y;
    /*
     * Variable que conté les arestes a les que esta relacionat el punt.
     */
    private Vector arestes= new Vector();
    /*
     * Variable que conté la informació adicional pels punts d'interés.
     */
    private Vector informacio = null;
    
    
    
     public void writeObject(IOutputStream out) { 
        out.writeInt(codi);
        out.writeString(nom);
        out.writeInt(longitud);
        out.writeInt(latitud);
        out.writeString(ciutat);
        out.writeString(linia);
        out.writeInt(codiXarxa);
        out.writeObject((TipusPuntImpl) tipus);
        out.writeInt(x);
        out.writeInt(y);
        out.writeObject((IPersistent) arestes);
        out.writeObject((IPersistent) informacio);
        
     }
    
    public void readObject(IInputStream in) { 
        codi = in.readInt();
        nom = in.readString();
        longitud = in.readInt();
        latitud = in.readInt();
        ciutat = in.readString();       
        linia = in.readString();
        codiXarxa = in.readInt();
        tipus = (TipusPunt) in.readObject();
        x = in.readInt();
        y = in.readInt();
        arestes = (Vector) in.readObject();        
        informacio = (Vector) in.readObject();
   
    
    }
 

    public int getCodi() {
        return this.codi;
    }
    
    public void setCodi(int codi) {
        this.codi = codi;
    }

    public String getNom() {
        return this.nom;
    }
    
    public void setNom(String nom){
        this.nom = nom;
    }

    public int getLatitud() {
        return this.latitud;
    }
    
    public void setLatitud(int latitud){
        this.latitud = latitud;
    }

    public int getLongitud() {
        return this.longitud;
    }
    
    public void setLongitud(int longitud){
        this.longitud = longitud;
    }

    public String getLinia() {
        return this.linia;
    }
    
    public void setLinia(String linia){
        this.linia = linia;
    }

    public TipusPunt getTipus() {
        return this.tipus;        
    }
    
    public void setTipus(TipusPunt tipus){
        this.tipus = tipus;
    }
 
    public Vector getArestes() {
        return (Vector)this.arestes.elements();
    }
    
    public void setArestes(Vector arestes){
        this.arestes = arestes;
    }
    
    public String getCiutat(){
        return this.ciutat;
    }
    
    public void setCiutat(String ciutat){
        this.ciutat = ciutat;
    }

    public Vector getInformacio() {
        return this.informacio;
    }
    
    public void setInformacio(Vector informacio){
        this.informacio = informacio;
    }
    
    public void setCoordenades(Aresta aresta, int numero) {        
        int x1 = aresta.getPuntInici().getCoordenadaX();
        int y1 = aresta.getPuntInici().getCoordenadaY();
        int x2 = aresta.getPuntFinal().getCoordenadaX();
        int y2 = aresta.getPuntFinal().getCoordenadaY();
        int d = Math.calculaDistancia(x1, x2, y1, y2);
        int d1 = d/(Math.abs(aresta.getNumeroFinal()-aresta.getNumeroInici())-1);
        int dx = ((x2-x1)/d)*d1;
        int dy = ((y2-y1)/d)*d1;
        this.x = x1 + dx;
        this.y = y1 + dy;        
    }

    public int getCodiXarxa() {
	return this.codiXarxa;
    }
    
    public void setCodiXarxa(int codiXarxa){
        this.codiXarxa = codiXarxa;
    }

    public void addInformacio(String tipus, String informacio) {
        Vector nouVector = new Vector();
        nouVector.insertElementAt(tipus, 0);
        nouVector.insertElementAt(informacio, 1);
        this.informacio.addElement(nouVector);
    }
    
    public void setInformacio(int posicio, String informacio){
        Vector nouVector = (Vector)this.informacio.elementAt(posicio);
        nouVector.setElementAt(informacio, 1);
        this.informacio.setElementAt(nouVector, posicio);
    }
    
    public int getCoordenadaX() {
        return this.x;
    }
    
    public void setCoordenadaX(int x){
        this.x = x;
    }
    
    public int getCoordenadaY() {
        return this.y;
    }
    
    public void setCoordenadaY(int y){
        this.y = y;
    }

    public PuntImpl(){
        
    }
    
    public PuntImpl(Storage db){
        super(db);
    }
}
